package com.intretech.tj.mqtt.Source;

import com.intretech.tj.mqtt.entity.Subscriber;
import io.netty.handler.codec.mqtt.MqttQoS;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public interface TopicInterface {
    /**
     * 主题池<br/>
     * 记录订阅信息
     */
    Map<String, List<Subscriber>> topicMap = new ConcurrentHashMap<>();

    /**
     * 主题池添加或删除主题
     *
     * @param topic  主题
     * @param addKey true为添加false为删除
     */
    void change(String topic, boolean addKey);

    void messageAdd(String topic);

    /**
     * 订阅
     *
     * @param topic    主题
     * @param qos      qos等级
     * @param clientID 客户端id
     */
    void subscribe(String topic, MqttQoS qos, String clientID);

    /**
     * 退订
     *
     * @param topic    主题
     * @param clientID 客户端id
     */
    void unsubscribe(String topic, String clientID);

    /**
     * 退订该用户所有订阅
     *
     * @param clientID 客户端id
     */
    void unsubscribe(String clientID);

    /**
     * 根据主题名中获取主题池中对应的链接<br/>
     * 主题名中可能存在通配符，通过通配符匹配主题<br/>
     *
     * @param topic 含有通配符的主题
     * @return 订阅者主题与订阅者链接map<br />
     * key:匹配的主题<br/>
     * value:订阅者列表
     */
    Map<String, List<Subscriber>> getTopicsForWildcard(String topic);


    /**
     * 获取当前所有主题
     *
     * @return 主题列表
     */
    List<String> getTopicList();
}
